package br.com.jk.util.version;

import br.com.jk.util.Util;
import br.com.jk.util.ZipUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
 *
 * @author camilo
 */
public class VersionProp implements Runnable {

  public Version getNewVersion() {
    Version newVersion = new Version();
    Properties prop = new Properties();
    try {
      InputStream inputNew = this.getClass().getResourceAsStream("newversion.properties");
      URL url = new URL("http://ubuntuone.com/3dwrzmcJJuJqEjgDSbmgQZ");
      InputStream isUrl = url.openStream();
      File file = new File(this.getClass().getResource("newversion.properties").getFile());
//      FileOutputStream fos = new FileOutputStream("./src/br/com/jk/util/version/newversion.properties");
      FileOutputStream fos = new FileOutputStream(this.getClass().getResource("newversion.properties").getFile());
//      URLConnection urlcon = url.openConnection();
      int bytes = 0;

//      Grava o arquivo no computador
      while ((bytes = isUrl.read()) != -1) {
//          File file = new File(destino);
//          jpbDownload.setValue(Integer.parseInt(String.valueOf(file.length()))+1);
        fos.write(bytes);
      }
      prop.load(inputNew);
      newVersion.setLink(new URL(prop.getProperty("link")));
      newVersion.setVersao(prop.getProperty("versao"));

      return newVersion;
    } catch (IOException e) {
      Util.msgErro(e);
      return null;
    }
  }

  public Version getVersion() {
    try {
      Version version = new Version();
      Properties prop = new Properties();
      InputStream input = this.getClass().getResourceAsStream("version.properties");
      prop.load(input);
      version.setLink(new URL(prop.getProperty("link")));
      version.setVersao(prop.getProperty("versao"));
      return version;
    } catch (IOException e) {
      Util.msgErro(e, "Ocorreu um problema ao identificar a versão do sistema.");
      return null;
    }
  }

  public void setVersion(Version novaVersao) {
    Properties prop = new Properties();
    prop.setProperty("versao", novaVersao.getVersao());
    prop.setProperty("link", novaVersao.getLink().toString());

    try {
//      Cria uma instância do arquivo properties
      File file = new File(this.getClass().getResource("version.properties").getFile());
//      Prepara o arquivo para ser manipulado e posteriormente salvo
      FileOutputStream fos = new FileOutputStream(file);
//      salva o arquivo properties
      prop.store(fos, null);
//      fecha o arquivo
      fos.close();
    } catch (IOException e) {
      Util.msgErro(e, "Não foi possível configurar a nova versão.");
      return;
    }
  }

  public void comparaVersoes() {
    Version newVersion = this.getNewVersion();
    Version version = this.getVersion();

    Integer novaVersao = Integer.parseInt(newVersion.getVersao().substring(0, 1));
    Integer oldVersao = Integer.parseInt(version.getVersao().substring(0, 1));
    if (novaVersao == oldVersao) {
      Integer novaSub = Integer.parseInt(newVersion.getVersao().substring(3, 4));
      Integer oldSub = Integer.parseInt(version.getVersao().substring(3, 4));
      if (novaSub == oldSub) {
        Integer novaCorr = Integer.parseInt(newVersion.getVersao().substring(6));
        Integer oldCorr = Integer.parseInt(version.getVersao().substring(6));
        if (novaCorr == oldCorr) {
          System.out.println("A versão utilizada é a mais atual.");
        } else {
          atualizaVersao(newVersion);
        }
      } else {
        atualizaVersao(newVersion);
      }
    } else {
      atualizaVersao(newVersion);
    }

  }

  private void atualizaVersao(Version novaVersao) {
    try {//    Fazer download e descompactar os arquivos do executável
      URL url = new URL("http://ubuntuone.com/5ZKtd6vN7z2XeaP8RR5Plj");
      InputStream isUrl = url.openStream();
      FileOutputStream fos = new FileOutputStream("dist-teste.zip");
//      URLConnection urlcon = url.openConnection();
      int bytes = 0;

//      Grava o arquivo no computador
      while ((bytes = isUrl.read()) != -1) {
//          File file = new File(destino);
//          jpbDownload.setValue(Integer.parseInt(String.valueOf(file.length()))+1);
        fos.write(bytes);
      }
    } catch (IOException e) {
      Util.msgErro(e, "Não foi possível completar o download da atualização.");
    }

    ZipUtil zip = new ZipUtil();
    try {
      zip.extrairZip(new File("dist-teste.zip").getAbsoluteFile(), new File("./dist/").getAbsoluteFile());
      System.out.println(new File("dist-teste.zip").getAbsoluteFile().getPath());
      System.out.println(this.getClass().getResource("version.properties").getFile());
//Apaga os arquivos existentes na pasta lib antes de descompactar
      File file = new File("./dist/lib/").getAbsoluteFile();
      if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
          f.delete();
        }
      }
      file.delete();
      zip.extrairZip(new File("./dist/lib.zip").getAbsoluteFile(), new File("./dist/").getAbsoluteFile());
    } catch (IOException e) {
      Util.msgErro(e, "Não foi possível descompactar a atualização baixada");
    }

//    this.setVersion(novaVersao);
    System.out.println("Atualizaçao completada!");
  }

  @Override
  public void run() {
    new VersionProp().comparaVersoes();
  }
}
